package com.mdjukebox.services.quartz.jobs;

import java.sql.Timestamp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.mdjukebox.model.vo.PeticionVO;
import com.opensms.mo.SMSVO;
import com.util.configuration.ConfigurationParametersManager;
import com.util.configuration.MissingConfigurationParameterException;
import com.util.exceptions.NoMatchException;

/**
 * Singleton
 * Parsea el mensaje del SMS para crear una PeticionVO
 */
public class SMStoPeticion {
	protected static final Log log = LogFactory.getLog(SMStoPeticion.class);

	private String patron;
	private int posIdCancion;
	private int posTxtDedicatoria;
	private Pattern p;
	
	private static SMStoPeticion instance = null;
	
	private SMStoPeticion(){
		//valores por defecto
		String patronConf = "JK ([0-9]+) ((.*))";

		int posIdCancionConfInt  = 1;
		int posTxtDedicatoriaInt  = 2;

		//Obtener el parametros de configuracion
		try {
			patronConf = ConfigurationParametersManager.getParameter("SMSToPeticion/patronSMS");
			String posIdCancionConf = ConfigurationParametersManager.getParameter("SMSToPeticion/posIdCancion");
			posIdCancionConfInt = Integer.valueOf(posIdCancionConf);
			String posTxtDedicatoriaConf = ConfigurationParametersManager.getParameter("SMSToPeticion/posTxtDedicatoria");
			posTxtDedicatoriaInt = Integer.valueOf(posTxtDedicatoriaConf);
		} catch (MissingConfigurationParameterException e) {
			if (log.isWarnEnabled()) log.warn("Configuracion incompleta, usando valores por defecto: " + e.getMessage());
		}
		this.patron = patronConf;
		this.posIdCancion = posIdCancionConfInt;
		this.posTxtDedicatoria = posTxtDedicatoriaInt;
		
		//inicializar el Pattern
		p = Pattern.compile(patron);
	}

	//	 creador sincronizado para protegerse de posibles problemas  multi-hilo
	private synchronized static void createInstance() {
        if (instance == null) { 
        	instance = new SMStoPeticion();
        }
    }
	
	public static SMStoPeticion getInstance(){
		if (instance==null) createInstance();
		return instance;
	}
	
	public PeticionVO toPeticion(SMSVO sms)
		throws NoMatchException{

		//parsear txt sms con patron
		Matcher m = p.matcher(sms.getMensaje());
		PeticionVO rdo = null;
		if (m.matches()){
			String idCancionTxt = m.group(posIdCancion);
			String dedicatoria = m.group(posTxtDedicatoria);
			log.debug("---- Fecha SMS " + sms.getFecha());
			rdo = new PeticionVO(0, Integer.parseInt(idCancionTxt), sms.getFecha() ,null, dedicatoria);
		}else{
			throw new NoMatchException(patron, sms.getMensaje());
		}
		return rdo;
	}
	
}
